package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法  关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象--多态绝对关系
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么情况下使用抽象类？
 * 复杂项目时，需要在不同类下实现不同功能，首选抽象类【Android安卓】
 *
 * 如何定义抽象类与抽象方法？
 * 抽象类：修饰符 abstract class 类名｛｝ ---------毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 abstract 返回值 方法（参数）;-----没有具体实现
 *
 * 抽象类“实例化”：创建对象--抽象类自身无法实例化
 * ①创建子类【n个】，继承【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类 引用=new 【实现】子类();
 * 注意：抽象类一定会发生重写，子类继承抽象【父】类，也可以叫做“实现类”
 */
abstract class Animals{  //抽象类
    //抽象方法【没有具体的实现（代码块）】-----一定继承---一定多态性
    public abstract void say();
    //1.定义由final修饰的抽象方法 ？   ✖
//    public final abstract void sleep();
    //2.定义抽象的变量 ？             ✖
//    abstract int i=1;
    //3.定义静态变量 ？               ✔
    static int i=1;
    //4.定义静态的抽象变量 ？          ✖
//    static abstract int j=1;
    //5.定义静态抽象方法【无实现】 ？    ✖
//    public static abstract void eat();
    //6.定义静态的方法【无实现：空代码块】 ？     ✔
    public static void eat(){}
    //5.6.总结：抽象方法/静态方法，方法定义：修饰符 static/abstract 返回值 方法名
    //7.可以定义内部类：静态内部类 ？     ✔
    static class Sos{}
    //8.抽象类有构造器吗？              ✔
    public Animals(){
    }
    //9.抽象类普通实现方法 ？           ✔
    public void run(){}
}
//10.抽象类可以继承抽象类吗？    ✔实现：两个抽象类--形容一个实现
abstract class Thing extends Animals{
    public abstract void sleep();
}
//目的：两个抽象类中所有抽象方法--继承【子】抽象类
//实现类：实现抽象[父]类的方法 ----- 多个实现类---继承---抽象
class Person1 extends Animals{ //报错原因：完成重写
    public void say() {
        System.out.println("人---说话~");
    }

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无话实现类：提供抽象方法--必须由子类实现--多态
        Animals a=new Person1();
        a.say(); //向上造型--重写：抽象【父】类的抽象方法【覆盖】
    }
}